#include <iostream>
#include <cstring>
#include <jsoncpp/json/json.h>
// 结构化转字符串、字符串转结构化---->序列化和反序列化
// 请求要有序列化的接口、客户端要发请求给服务器， 也要有反序列化，因为服务器也需要读到请求，然后我们做反序列化
class Request
{
public:
    Request()
    {

    }
    Request(int x, int y, char oper) : _x(x), _y(y), _oper(oper)
    {
    }
    // 客户端用序列----->目的是把结构化字段转化成一个字符串
    bool Serialize(std::string *out)
    {
        Json::Value root;
        root["x"] = _x;
        root["y"] = _y;
        root["oper"] = _oper;

        // Json::Value sub;
        // sub["name"] = "张三";
        // sub["age"] = 12;
        // //Json::value中可以套对象，最后是可以呈树状呈现
        // root["sub"] = sub;

        // Json::Value array(Json::arrayValue);
        // array.append(1);
        // array.append(2);
        // array.append(5);

        // root["array"] = array;

        // FastWriter是一个类
        // Json::FastWriter writer;
        Json::StyledWriter writer;

        std::string s = writer.write(root);
        // std::cout << s << std::endl;
        *out = s;
        return true;
    }
    // 服务端用反序列，别人会给我传进来一个字符串，我需要将这个字符串转成结构化字段（内部属性的值
    void Deserialize(const std::string &in)
    {
        Json::Value root;
        Json::Reader reader;
        // 传进来的字符串转换成发序列化成一个json对象
        bool res = reader.parse(in, root);
        // std::cout <
        _x = root["x"].asInt();
        _y = root["y"].asInt();
        _oper = root["oper"].asInt();
    }
    void Print()
    {
        std::cout << _x << std::endl;
        std::cout << _y << std::endl;
        std::cout << char(_oper) << std::endl;
    }
    ~Request()
    {
    }

private:
    int _x;
    int _y;
    char _oper; //+ 、— 、/、% //x oper y
};

int main()
{
    // Request req(111, 222, '-');
    // std::string s;
    // req.Serialize(&s);
    // std::cout << s << std::endl;

    std::string s = "{\"oper\":45,\"x\":111,\"y\":222}";
    Request req;
    req.Deserialize(s);
    req.Print();

    return 0;
}